package gob.inei.enaho.model.service;

import java.sql.SQLException;
import java.util.List;

import android.database.Cursor;

import util.android.sqlite.SQLiteUtil;
import util.android.sqlite.SelectSQLite;
import util.android.sqlite.SeteadorSQLite;
import util.www.sql.WhereSql;

import gob.inei.enaho.model.dao.mapping.TablaVisitaEncuestador;
import gob.inei.enaho.model.domain.persona.Hogar;
import gob.inei.enaho.model.domain.tiempo.VisitaEncuestador;
import gob.inei.enaho.model.domain.ubicacion.CoordenadaGeografica;


public abstract class AbstractVisitaService<V extends VisitaEncuestador> 
extends AbstractService
{
	
	private final Class<V> clase;
	
	public AbstractVisitaService(Class<V> clase) {
		this.clase = clase;
	}
	
		
	protected final SelectSQLite<V> geSelectByHogar(final Hogar hogar) throws SQLException {
		SelectSQLite<V> s = new SelectSQLite<V>(clase);
		
		WhereSql w = new WhereSql();
		w.and(TablaVisitaEncuestador.CONGLOMERADO+"=",hogar.getVivienda().getConglomerado().getCodigo());
		w.and(TablaVisitaEncuestador.VIVIENDA+"=",hogar.getVivienda().getCodigo());
		w.and(TablaVisitaEncuestador.HOGAR+"=",hogar.getCodigoString());
		
		s.setSelect("select *");
		s.setFrom("from "+getNombreTabla());
		s.setWhereHaving(w.getSql());
		s.setOrderby("order by "+TablaVisitaEncuestador.VISITA);
		s.setSeteador(new SeteadorSQLite<V>() {			
			@Override
			public void ejecutar(Cursor cr,V obj) {
				setear(cr,obj,hogar);
			}
		});		
		
		return s;
	}

	
	public final List<V> findByHogar(final Hogar hogar) throws SQLException {
		return geSelectByHogar(hogar).getLista(getOpenHelper());
	}

	public final V findUltimaVisitaByHogar(Hogar hogar) throws SQLException {
		List<V> lista = findByHogar(hogar);
		if(lista.isEmpty())
			return null;		
		return lista.get(lista.size()-1);
	}
	
	protected void setear(Cursor c, V vis, Hogar hogar) {
		vis.setHogar(hogar);
		vis.setNumero(SQLiteUtil.getInteger(c, TablaVisitaEncuestador.VISITA));
		vis.setFecha(SQLiteUtil.getString(c, TablaVisitaEncuestador.FECHA));
		vis.setHoraInicio(SQLiteUtil.getString(c, TablaVisitaEncuestador.HORA_INI));
		vis.setHoraFinal(SQLiteUtil.getString(c, TablaVisitaEncuestador.HORA_FIN));
		vis.setResultado(SQLiteUtil.getString(c, TablaVisitaEncuestador.RESULTADO));
		CoordenadaGeografica co = new CoordenadaGeografica();
		co.setLatitud(SQLiteUtil.getString(c, TablaVisitaEncuestador.LATITUD));
		co.setLongitud(SQLiteUtil.getString(c, TablaVisitaEncuestador.LONGITUD));
		vis.setCoordenadas(co);
	}
	
	public void eliminar(V vis) throws SQLException {
		Hogar hg = vis.getHogar();
		
		VisitaEncuestador uv = findUltimaVisitaByHogar(hg);
		
		WhereSql w = new WhereSql();
		w.and(TablaVisitaEncuestador.CONGLOMERADO+"='"+hg.getVivienda().getConglomerado().getCodigo()+"'");
		w.and(TablaVisitaEncuestador.VIVIENDA+"='"+hg.getVivienda().getCodigo()+"'");
		w.and(TablaVisitaEncuestador.HOGAR+"='"+hg.getCodigo()+"'");
		//w.and(VisitaEncuestadorTable.VISITA+"='"+vis.getNumero()+"'");
		w.and(TablaVisitaEncuestador.VISITA+"=?");	
		
		//ELIMINANDO
		w.setParametro(1,vis.getNumero());
		String sql = "delete from "+getNombreTabla()+" "+w.getSql();
		SQLiteUtil.executeUpdate(getOpenHelper(), sql);
		
		//ACTUALIZANDO NUMEROS DE VISITA POSTERIORES
		for(int i=vis.getNumero(); i<=uv.getNumero(); i++) {
			w.setParametro(1,i);
			SQLiteUtil.executeUpdate(getOpenHelper(), "update "+getNombreTabla() +
					" set "+TablaVisitaEncuestador.VISITA+"="+(i-1)
					+" "+w.getSql());
		}
		
	}


	
}
